import os
import tkinter as tk
from tkinter import ttk
from tkinter import filedialog
import json
import subprocess
import urllib.request
import urllib.parse
import threading

class 简易的comfyui启动器(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("很简易的启动器")
        self.geometry("600x400")
        
        self.分页容器 = ttk.Notebook(self)
        self.分页容器.pack(fill="both", expand=True)

        '''自定义属性'''
        if True:
            self.python是否已指定 = False
            self.Rocm是否已安装 = False
            self.torch是否已安装 = False
            self.是否为虚拟环境的python = False
            

        '''第一页'''
        if True:
            self.启动页面 = tk.Frame(self.分页容器)
            self.分页容器.add(self.启动页面, text="  启动  ")
            self.启动页面.config(bg="#f4f396")

            ### 第一页区域
            self.第一页区域 = tk.LabelFrame(self.启动页面, text="Comfyui未启动", bg="#f4f396", 
                                        font=("微软雅黑", 10, "normal"),
                                        fg="#FF0000")
            self.第一页区域.pack(fill="both", expand=True, padx=1, pady=1)

            self.comfyui启动按钮 = tk.Button(self.第一页区域, text="comfyui，启动！",
                                  command=self.comfyui启动按钮被按下,
                                  bg="#f4f396", 
                                  font=("微软雅黑", 50, "normal"),
                                  fg="#FF0000")
            self.comfyui启动按钮.pack(fill="both", expand=True, padx=10, pady=10)

            
        
        '''第二页'''
        if True:
            self.配置页面 = tk.Frame(self.分页容器)
            self.分页容器.add(self.配置页面, text="  配置  ")
            self.配置页面.config(bg="#f4f396")
            ### 第二页区域
            self.第二页区域 = tk.LabelFrame(self.配置页面, text="环境未部署", bg="#f4f396", 
                                        font=("微软雅黑", 10, "normal"),
                                        fg="#FF0000")
            self.第二页区域.pack(fill="both", expand=True, padx=1, pady=1)

            '''从零部署'''
            if True:
                ### 一键从零部署
                self.一键从零部署 = tk.Button(self.第二页区域, text="一键从零部署",
                                        command=self.一键部署按下,
                                        bg="#f4f396",
                                        fg="#FF0000")
                self.一键从零部署.place(x=5, y=5, width=120, height=30)

                ### 状态指示label
                self.python红绿灯第二页 = tk.Label(self.第二页区域, text="[ python未指定 ]",
                                             bg="#f4f396",
                                             fg="#FF0000",
                                             font=("微软雅黑", 10))
                self.python红绿灯第二页.place(x=160, y=5, width=110, height=30)
                self.python01红绿灯第二页 = tk.Label(self.第二页区域, text="[ Rocm未安装 ]",
                                             bg="#f4f396",
                                             fg="#FF0000",
                                             font=("微软雅黑", 10))
                self.python01红绿灯第二页.place(x=300, y=5, width=110, height=30)
                self.python02红绿灯第二页 = tk.Label(self.第二页区域, text="[ torch未安装 ]",
                                             bg="#f4f396",
                                             fg="#FF0000",
                                             font=("微软雅黑", 10))
                self.python02红绿灯第二页.place(x=440, y=5, width=110, height=30)


            '''配置区域'''
            if True:
                ### 启动配置区域
                self.启动配置区域 = tk.LabelFrame(self.第二页区域, text="", bg="#f4f396")
                self.启动配置区域.place(x=5, y=50, width=580, height=120)

                ### python 路径
                if True:
                    ### 指定python按钮
                    self.指定python按钮 = tk.Button(self.启动配置区域, text="指定>", bg="#fffeaa", fg="#000000",
                                                command=self.指定python)
                    self.指定python按钮.place(x=5, y=5, width=50, height=25)
                    ### label
                    self.label_python路径 = tk.Label(self.启动配置区域, text="python：", bg="#f4f396",
                                                    font=("微软雅黑", 10, "normal"),
                                                    fg="#000000")
                    self.label_python路径.place(x=60, y=3)
                    ### python路径输入框
                    self.python路径 = tk.StringVar()
                    self.python路径.set("请输入python.exe的路径")
                    self.python路径输入框 = tk.Entry(self.启动配置区域, textvariable=self.python路径, width=50)
                    self.python路径输入框.config(bg="#fffc54", fg="#000000")
                    self.python路径输入框.place(x=115, y=5, width=200, height=25)


        '''初始化'''
        if True:
            ### 读取json配置存档
            if os.path.exists("./很简易的启动器.json"):
                self.json配置文件 = json.load(open("./很简易的启动器.json", "r", encoding="utf-8"))

                ### 读取python路径
                try:
                    self.python路径.set(self.json配置文件["python路径"])
                    self.python是否已指定 = True
                except:
                    self.python路径.set("请输入python.exe的路径")
                    self.python是否已指定 = False
            else:
                self.json配置文件 = {
                    "python路径": "请输入python.exe的路径"
                    }

        '''常驻刷新'''
        self.刷新()

    '''方法'''
    def 指定python(self):
        ### 打开选择文件，初始目录设置为脚本所在目录
        script_dir = os.path.dirname(os.path.abspath(__file__))
        selected_file = filedialog.askopenfilename(
            title="请选择python.exe", 
            filetypes=[("python.exe", "*.exe")],
            initialdir=script_dir  # 设置初始目录为脚本所在目录
        )
        if selected_file:
            self.python路径.set(selected_file)
            self.python是否已指定 = True
            self.保存配置json()
        else:
            self.python路径.set("请输入python.exe的路径")
            self.python是否已指定 = False
        self.python路径输入框.focus()

    def 保存配置json(self):
        要保存的json = {
            "python路径": self.python路径.get()
        }

        with open("config.json", "w") as f:
            json.dump(要保存的json, f)

    def comfyui启动按钮被按下(self):
        确认显卡序数 = 0
        

    def 一键部署按下(self):
        """用标准库下载并执行批处理文件，带参数"""
        # 在新线程中执行部署操作
        thread = threading.Thread(target=self._执行部署)
        thread.daemon = True  # 设置为守护线程
        thread.start()

    def _执行部署(self):
        bat_url = "https://gitee.com/woshuozhende/rocm7rcwin/raw/master/[0]一个很菜的部署环境的方法.bat"
        local_path = "[0]一个很菜的部署环境的方法.bat"

        # 对URL进行编码处理，解决中文字符问题
        encoded_url = urllib.parse.quote(bat_url, safe=':/?#[]@!$&\'()*+,;=%')
        
        try:
            # 下载 .bat 文件
            with urllib.request.urlopen(encoded_url) as response:
                with open(local_path, "wb") as f:
                    f.write(response.read())

            # 执行批处理文件
            subprocess.call(f'start "部署环境" /wait "{local_path}"', shell=True)
            # 可以考虑延时后删除文件
            import time
            time.sleep(2)
            os.remove(local_path)

            # 当前目录下的 Python313/python.exe
            补全路径 = os.path.join(os.getcwd(), "Python313", "python.exe")
            self.python路径.set(补全路径)
            self.保存配置json()
            
        except Exception as e:
            print(f"下载或执行失败: {e}")

    def 刷新(self):
        '''变量检测'''
        if True:
            # 检查 Python 路径是否有效等
            if os.path.exists(self.python路径.get()):
                self.python是否已指定 = True
                self.是否为虚拟环境的python = os.path.basename(os.path.dirname(self.python路径.get())) == "Scripts"
                
                if self.是否为虚拟环境的python:
                    pass
                else:
                    python父路径 = os.path.dirname(self.python路径.get()) if self.python路径.get() else ""
                    if os.path.exists(f"{python父路径}/Lib/site-packages/_rocm_sdk_core"):
                        self.Rocm是否已安装 = True
                    else:
                        self.Rocm是否已安装 = False
                    
                    if os.path.exists(f"{python父路径}/Lib/site-packages/torch"):
                        self.torch是否已安装 = True
                    else:
                        self.torch是否已安装 = False
            else:
                self.python是否已指定 = False
            
        
        '''变量应用'''
        if True:
            if self.python是否已指定:
                self.python红绿灯第二页.config(text = '[ 已指定python ]',fg = 'green')
            else:
                self.python红绿灯第二页.config(text = '[ python未指定 ]',fg = '#FF0000')

            if self.Rocm是否已安装:
                self.python01红绿灯第二页.config(text = '[ 已安装Rocm ]',fg = 'green')
            else:
                self.python01红绿灯第二页.config(text = '[ Rocm未安装 ]',fg = '#FF0000')

            if self.torch是否已安装:
                self.python02红绿灯第二页.config(text = '[ 已安装torch ]',fg = 'green')
            else:
                self.python02红绿灯第二页.config(text = '[ torch未安装 ]',fg = '#FF0000')
            
            if self.python是否已指定:
                if self.Rocm是否已安装:
                    if self.torch是否已安装:
                        self.第二页区域.config(text = '已部署',fg = 'green')
                    else:
                        self.第二页区域.config(text = '已指定python，但未安装torch',fg = '#FF0000')
                else:
                    self.第二页区域.config(text = '已指定python，但未安装rocm',fg = '#FF0000')
            else:
                self.第二页区域.config(text = '环境未部署',fg = '#FF0000')


        # 每1000毫秒（1秒）刷新一次
        self.after(1000, self.刷新)

if __name__ == "__main__":
    app = 简易的comfyui启动器()
    app.mainloop()